package com.tth.learn.addproperties.java;

import org.junit.Test;

import java.io.*;

/**
 * @Author tth
 * @Date 2022/12/26 15:41
 */
public class OtherStreamTest {

    /**
     * 标准的输入、输出流
     * System.in: 标准的输入流，默认从键盘输入
     * System.out: 标准的输出流，默认从控制台输出
     */
    @Test
    public void test1() {
        BufferedReader br = null;
        try {
            // 1.造流。
            // 因为需要用到读取整行的功能，而只有BufferedReader有读取整行的函数，因此需要BufferedReader流。
            // 又因System.in的类型是InputStream，所以需要用到转换流InputStreamReader将InputStream转为BufferedReader
            // 1.1 先创建了转换流InputStreamReader流，将字节输入流转换为字符输入流
            InputStreamReader isr = new InputStreamReader(System.in);
            // 1.2 再创建了BufferedReader字符读取流。
            br = new BufferedReader(isr);

            // 2.读取整行字符串，将其转为大写
            while (true) {
                System.out.println("请输入字符串");
                String data = br.readLine();
                if (null == data || "e".equalsIgnoreCase(data) || "exit".equalsIgnoreCase(data)) {
                    System.out.println("程序结束");
                    break;
                }

                String dataUpperCase = data.toUpperCase();
                System.out.println(dataUpperCase);

            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 3.关闭流
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 打印流
     * PrintStream/PrintWrite
     *
     * 将System.out的内容输出到info.txt文件中
     */
    @Test
    public void test2() {
        PrintStream ps = null;
        try {
            // 1.创建流
            FileOutputStream fos = new FileOutputStream("info.txt");
            ps = new PrintStream(fos);

            // 2.把标准输出流（控制台输出）改成文件
            if (null != ps) {
                System.setOut(ps);
            }

            // 3.输出
            for (int i = 0; i < 255; i++) {
                System.out.print((char) i);
                // 每50个字符一行
                if (i % 50 == 0) {
                    System.out.println();
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 4.关闭流
            if (null != ps) {
                ps.close();
            }
        }
    }

    /**
     * 数据流
     * DataInputStream、DataOutputStream
     */
    @Test
    public void test3() {
        // 将内存中的字符串、基本数据类型的变量写出到文件中
        DataOutputStream dos = null;
        try {
            dos = new DataOutputStream(new FileOutputStream("data.txt"));
            dos.writeUTF("唐天华");
            dos.flush();
            dos.writeInt(18);
            dos.flush();
            dos.writeBoolean(false);
            dos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != dos) {
                try {
                    dos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


        // 读取文件中的存储的基本类型变量和字符串到内存，保存在变量中
        DataInputStream dis = null;
        try {
            dis = new DataInputStream(new FileInputStream("data.txt"));

            // 注意：数据的读取顺序要和写入顺序保持一致，否则会报EOFException
            String name = dis.readUTF();
            int age = dis.readInt();
            boolean isMale = dis.readBoolean();
            System.out.println("name = " + name);
            System.out.println("age = " + age);
            System.out.println("isMale = " + isMale);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭流
            if (null != dis) {
                try {
                    dis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 对象流
     */
    public void test4() {

    }
}
